package com.tangruojie.config;

import com.tangruojie.filter.RequestLogFilter;
import com.tangruojie.filter.ResponseEnhanceFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 过滤器配置类
 */
@Configuration
public class FilterConfiguration {

    /**
     * 1、普通 Servlet Filter
     * 默认执行顺序：Ordered.LOWEST_PRECEDENCE = Integer.MAX_VALUE（最后执行）。
     * 2、Spring Security 的 FilterChainProxy
     * 默认执行顺序：@Order(0)（非常靠前）。
     * 3、Security 链里的内部 Filter
     * 顺序固定，由框架维护，你只能用 addFilterBefore/After/At 来调整相对位置。
     */

    /**
     * 需要参与认证/授权上下文（读写 SecurityContextHolder、影响后续授权）的 → 进 Security 链
     * 只是做纯粹的 Servlet 层拦截/记录/修改，不依赖 Security → 容器级
     */

    /**
     * 注册全局日志过滤器，设置在最早执行（Order -100）
     * 确保在Spring Security等过滤器之前记录所有请求
     */
    @Bean
    public FilterRegistrationBean<RequestLogFilter> logFilter(RequestLogFilter filter) {
        FilterRegistrationBean<RequestLogFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(filter);
        // 对所有URL生效
        registrationBean.addUrlPatterns("/*");
        // 设置高优先级（数值越小，优先级越高），确保最先执行
        registrationBean.setOrder(-100);
        // 给过滤器起个名字，方便识别
        registrationBean.setName("requestLogFilter");
        return registrationBean;
    }

    /**
     * 注册响应增强过滤器，设置在较后执行（Order 100）
     * 确保在Spring Security和Controller之后对响应进行加工
     */
    @Bean
    public FilterRegistrationBean<ResponseEnhanceFilter> respFilter(ResponseEnhanceFilter filter) {
        FilterRegistrationBean<ResponseEnhanceFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(filter);
        // 对所有URL生效
        registrationBean.addUrlPatterns("/*");
        // 设置较低优先级（数值越大，优先级越低），确保在主要处理之后执行
        registrationBean.setOrder(100);
        // 给过滤器起个名字，方便识别
        registrationBean.setName("responseEnhanceFilter");
        return registrationBean;
    }

}